iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
SideProject30

Hugo your Blog and Host your Podcast. 系列 第 26

RSS Provider / Just append, don't hesitate.

  • 分享至 

  • xImage
  •  

明日復明日,Lambda 何其多

  • 昨日 day25 少了的 function 就是 generateRSS(feed Feed) 啦,這個是最精華的部分
  • 要把 feed.json 轉換成為 feed.rss,一定會有很華麗的操作吧?

該怎麼做

  • 就是把東西通通加起來就好了,不要猶豫,不要猶豫,不要猶豫
  • 按照 RSS 的範例與規範,把 feed.json 的內容轉安插到文字當中
  • 因為在 s3.PutObjectInput 的 ContentType 已經指定為 application/xml 所以上傳的檔案只要符合規範,對齊 tag,就可以是合法的 rss
  • 這邊就不多說了,直接看醜醜醜的 code 吧
func generateRSS(feed Feed) []byte {
	rss := `<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">`
	rss += `<channel>`
	rss += fmt.Sprintf(`<title><![CDATA[%s]]></title>`, feed.Podcast.Title)
	rss += fmt.Sprintf(`<description><![CDATA[%s]]></description>`, feed.Podcast.Description)
	rss += fmt.Sprintf(`<link>%s</link>`, feed.Podcast.Link)
	rss += fmt.Sprintf(`<image><url>%s</url><title>%s</title><link>%s</link></image>`, feed.Podcast.Image.URL, feed.Podcast.Image.Title, feed.Podcast.Image.Link)
	rss += fmt.Sprintf(`<generator>%s</generator>`, "{YOUR_DOMAIN}")
	rss += fmt.Sprintf(`<lastBuildData>%s</lastBuildData>`, feed.Podcast.LastBuildDate)
	rss += fmt.Sprint(`<atom:link href="https://{YOUR_DOMAIN}/feed.rss" rel="self" type="application/rss+xml"/>`)
	rss += fmt.Sprintf(`<author><![CDATA[%s]]></author>`, feed.Podcast.Author)
	rss += fmt.Sprintf(`<copyright><![CDATA[%s]]></copyright>`, feed.Podcast.Author)
	rss += fmt.Sprintf("<language>%s</language>", feed.Podcast.Language)
	rss += fmt.Sprintf(`<category><![CDATA[%s]]></category>`, feed.Podcast.CategoryMain)
	rss += fmt.Sprintf(`<category><![CDATA[%s]]></category>`, feed.Podcast.CategorySub)
	rss += fmt.Sprintf(`<itunes:author>%s</itunes:author>`, feed.Podcast.Author)
	rss += fmt.Sprintf(`<itunes:summary><![CDATA[%s]]></itunes:summary>`, feed.Podcast.Description)
	rss += fmt.Sprintf(`<itunes:image href="%s"/>`, feed.Podcast.Image.URL)
	rss += fmt.Sprintf(`<itunes:type>%s</itunes:type>`, feed.Podcast.Type)
	rss += fmt.Sprint(`<itunes:owner>`)
	rss += fmt.Sprintf(`<itunes:name><![CDATA[%s]]></itunes:name>`, feed.Podcast.Author)
	rss += fmt.Sprintf(`<itunes:email>%s</itunes:email>`, feed.Podcast.Email)
	rss += fmt.Sprintf(`</itunes:owner>`)
	rss += fmt.Sprintf(`<itunes:explicit>%s</itunes:explicit>`, feed.Podcast.Explicit)
	rss += fmt.Sprintf(`<itunes:category text="%s"> <itunes:category text="%s" /></itunes:category>`, feed.Podcast.CategoryMain, feed.Podcast.CategorySub)
	for _, v := range feed.Podcast.Episodes {
		rss += fmt.Sprintf(`<item>`)
		rss += fmt.Sprintf(`<title><![CDATA[%s]]></title>`, v.Title)
		rss += fmt.Sprintf(`<description><![CDATA[%s]]></description>`, v.Description)
		rss += fmt.Sprintf(`<link>%s</link>`, v.Link)
		rss += fmt.Sprintf(`<guid>%s</guid>`, strings.Split(v.Link, "/")[:len(strings.Split(v.Link, "/"))-1])
		rss += fmt.Sprintf(`<dc:creator><![CDATA[%s]]></dc:creator>`, v.Creator)
		rss += fmt.Sprintf(`<pubDate>%s</pubDate>`, feed.Podcast.LastBuildDate)
		rss += fmt.Sprintf(`<enclosure url="%s" length="%s" type="audio/mpeg"/>`, v.Audio, v.Duration)
		rss += fmt.Sprintf(`<itunes:summary><![CDATA[%s]]></itunes:summary>`, v.Description)
		rss += fmt.Sprintf(`<itunes:explicit>%s</itunes:explicit>`, v.Explicit)
		rss += fmt.Sprintf(`<itunes:duration>%s</itunes:duration>`, v.Duration)
		rss += fmt.Sprintf(`<itunes:image href="%s"/>`, v.Image)
		rss += fmt.Sprintf(`<itunes:episode>%d</itunes:episode>`, v.Episode)
		rss += fmt.Sprintf(`<itunes:episodeType>%s</itunes:episodeType>`, v.Type)
		rss += fmt.Sprintf(`</item>`)
	}
	rss += `</channel></rss>`
	return []byte(rss)
}

  • 就是這樣樸實無華的加起來,記得替換掉 {YOUR_DOMAIN},或是把 domain 也放到 feed.json 中,這樣就可以動態生成了

其他延伸

  • 製作完成後別忘了把 feed.rss 的 url 放到 day24 介紹的 rss validator 中檢查一下,確保沒有問題喔
    https://ithelp.ithome.com.tw/upload/images/20231011/20152944NsXy9LufcH.png
  • 除了 itunes 專屬的 tag 外,其實 google 也有自己的 tag,但不用加上了,因為 G 社要終止 Podcast 服務,慢慢轉移到 Youtube Music 上

外出取材番外

  • 這是一個在艾雷島上發現,既是貓貓又是狗狗的存在
    https://ithelp.ithome.com.tw/upload/images/20231011/20152944oON4YTH0OZ.jpg

上一篇
RSS Provider / Who can help. Lambda!
下一篇
Into the Wild / Show up on all podcast platforms.
系列文
Hugo your Blog and Host your Podcast. 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言